package com.browan.freeppmobile.jni;

public class FreePPJNI {
	public interface StatusListener {
		static enum eventStatus {
			EVENT_REGISTRATION, /*
								 * Registration Result, info -> struct
								 * RegistrationInfo
								 */
			EVENT_STATE, /* Call state Changed, info -> struct CallInfo */
			EVENT_MESSAGE, /* Message Text, info -> struct MessageInfo */
			EVENT_LOG, /* Log Text, info -> char* */
			EVENT_CONTROL, /*
							 * conversation control from the peer, info ->
							 * struct ControlInfo*
							 */
		}

		static enum registrationResult {
			REGISTRATION_ACCEPT, REGISTRATION_REJECT, REGISTRATION_TIMEOUT,
		};

		static enum callStatus {
			CALL_FREE, /* the call has been hangup by local or remote user */
			CALL_OUTGOING, /* the caller has initiated an outgoing call */
			CALL_RINGIN, /* an incoming call received and play ring-in sound */
			CALL_RINGBACK, /*
							 * an outgoing call received by callee and play
							 * ringback sound
							 */
			CALL_ANSWERED, /* the call has been answered */
		};

		// Call Record Type
		static enum callType {
			OUTGOING_CALL, INCOMING_CALL, MISSED_CALL, REJECTED_CALL, /*
																	 * In
																	 * history,
																	 * this call
																	 * should be
																	 * treated
																	 * as
																	 * OUTGOING_CALL
																	 */
		};

		/**
		 * 
		 * onEvent(状态监听函数，用于监听底层的状态改变)
		 * 
		 * @param type
		 *            : enum eventStatus
		 * @param jsonString
		 * 
		 *            if(type == EVENT_LOG) jsonString 是一个log message 不需要解析 else
		 *            if(type == EVENT_REGISTRATION) jsonString格式：{id:%d,
		 *            reply:%d} reply : enum registrationResult else if(type ==
		 *            EVENT_STATE) jsonString格式:{callNo:%d,peer_name:%s, peernum
		 *            :%s, activity : %d, state : %d,start : %ld , duration :%d
		 *            ,type :%d } callNo : call ID peername : phone number
		 *            peernum : freePP ID activity : enum callStatus state :
		 *            previous state of this call start : 通话开始时间 duration : 通话时间
		 *            type : enum callType
		 * 
		 *            else if (type == EVENT_CONTROL)
		 *            jsonString格式：{callNo:%d,type:%d,value:%d}
		 * 
		 *            void
		 * 
		 * 
		 */

		public void onEvent(int type, String jsonString);
	}

	/**
	 * 初始化FreePP Mobile Engine
	 * 
	 * @param listener
	 *            传递给JNI用于监听状态的类。
	 * @return true succ else failed
	 */
	public native boolean initialize(StatusListener listener);

	/**
	 * 释放FreePP Mobile Engine
	 * 
	 * @return void
	 */
	public native void shutdown();

	/**
	 * 刷新FreePP Mobile Engine的网络连接
	 * 
	 * FreePP Mobile Engine在初始化时会创建一个UDP Socket 并随机绑定一个系统分配的UDP端口。当用户在网络中移动时，
	 * IP地址可能发生变化而导致此Socket失效。这种情况下， 应用程序只需调用此函数重新分配网络连接即可， 而无需重启整个FreePP Mobile
	 * Engine.
	 * 
	 * 使用情况：该接口在网络失效或网络切换时使用，如 网络短暂断开后重新连接，需要调用该接口，在 调用register接口，这样不需要调用init接口
	 * 用户可以重新注册。
	 * 
	 * @return void
	 */
	public native void refreshNetwork();

	/**
	 * 更改IAX注册时间间隔
	 * 
	 * @param secs
	 *            刷新时间间隔（秒），默认为 60s
	 * 
	 * @return void
	 */
	public native void setIaxRegInterval(int secs);

	/**
	 * 设置主叫方Freepp　ID
	 * 
	 * @param name
	 *            用户的昵称，传手机E.164号码即可
	 * @param users
	 *            用户的FreePP号码
	 */
	public native void setcallerid(String name, String users);

	/**
	 * Register to FreePP server
	 * 
	 * @param name
	 *            用户的昵称，传手机E.164号码即可
	 * @param user
	 *            用户的FreePP号码
	 * @param passwd
	 *            用户的登录密码
	 * @param host
	 *            注册服务器的地址和端口，格式为：IP地址:端口(port:4569)
	 * 
	 * @return 此账号标识符。
	 */

	public native int register(String name, String user, String passwd,
			String host);

	/**
	 * 发起一个外拨呼叫。
	 * 
	 * @param dest
	 *            被叫端的FreePP号码
	 * @param host
	 *            被叫端当前登录的注册服务器， 格式为“IP地址:端口” （注：应用程序在发起呼叫之前应首先通过其它手段，
	 *            如：CS服务器的FindCallee，获取被叫当前登录的服务器地址）
	 * @param user
	 *            主叫端的身份信息，格式为“用户名/密码”（用户名是什么？）
	 * @param cmd
	 *            端到端的呼叫通知（保留），目前传 null 即可
	 * 
	 * @return 此通话的唯一标识符。此标识符将始终处于递增状态，以确保上层应用不会产生混淆。
	 */
	public native int dail(String dest, String host, String user, String cmd);

	/**
	 * 接听一个呼入通话请求。
	 * 
	 * @param callNo
	 *            呼入通话的唯一标识符。 （注：应用程序首先通过线路状态事件通知获得来电线路的唯一标识符）
	 * @return void
	 */
	public native void answer(int callNo);

	/**
	 * 保持或恢复一个已接听的通话。
	 * 
	 * @param callNo
	 *            通话的唯一标识符。
	 * 
	 * @param hold
	 *            保持(1)或恢复(0)通话
	 * 
	 * @return void
	 */
	public native void hold(int callNo, int hold);

	/**
	 * 静音或取消静音一个已接听的通话。
	 * 
	 * @param callNo
	 *            此通话的唯一标识符。
	 * 
	 * @param mute
	 *            静音(1)或取消静音(0)。
	 * 
	 * @return void
	 */
	public native void mute(int callNo, int mute);

	/**
	 * 向对端发送DTMF信号。
	 * 
	 * @param callNo
	 *            此通话的唯一标识符。
	 * 
	 * @param digit
	 *            DTMF信号，包括：0-9,#,*。
	 * 
	 * @return void
	 */
	public native void sendDtmf(int callNo, String digit);

	/**
	 * 获取指定通话所使用的编解码器信息。
	 * 
	 * @param callNo
	 *            此通话的唯一标识符。
	 * 
	 * @return JSON String
	 * 
	 *         JSON格式：{codecName:%s,samplingRate:%d,packetSize:%d,channels:%d,
	 *         bitrate:%d}
	 */
	public native String getCodec(int callNo);

	/**
	 * 获取指定通话的网络性能统计。
	 * 
	 * @param callNo
	 *            此通话的唯一标识符。
	 * 
	 * @return JSON String
	 * 
	 *         JSON格式：{level:%d, pklost:%lf, avgspeed:%lf,speed:%lf,delay:%d}
	 *         level :general level of network quality (0-6) pklost :percentage
	 *         of lost packet avgspeed :average speed from the begining of call
	 *         speed :// instant speed for last 1 second delay :average round
	 *         trip time
	 */
	public native String getNetStat(int callNo);

	/**
	 * 获取指定通话的详细信息。
	 * 
	 * @param callNo
	 *            此通话的唯一标识符。
	 * 
	 * @return JSON String
	 * 
	 *         JSON格式：{callNo:%d,peer_name:%s, peernum :%s, activity : %d, state
	 *         : %d,start : %ld , duration :%d ,type :%d }
	 */
	public native String getCallInfo(int callNo);

	/**
	 * 设置指定通话的Codec格式。
	 * 
	 * @param callNo
	 *            此通话的唯一标识符。
	 * 
	 * @param format
	 *            更新的Codec格式
	 * 
	 *            #define IAXC_FORMAT_ULAW (1 << 2) //< Raw mu-law data (G.711)
	 *            #define IAXC_FORMAT_ALAW (1 << 3) //< Raw A-law data (G.711)
	 *            #define IAXC_FORMAT_SPEEX (1 << 9) //< Speex Audio / #define
	 *            IAXC_FORMAT_ILBC (1 << 10) //< iLBC Audio / #define
	 *            IAXC_FORMAT_SILK (1 << 13) //< SILK Audio /
	 * 
	 * @return 1 succ else 0 call state complete else -1 faild
	 * 
	 * 
	 */
	public native int setCodecFormat(int callNo, int format);

	/**
	 * 挂断一个通话或拒绝一个呼入请求。
	 * 
	 * @param callNo
	 *            此通话的唯一标识符。
	 * 
	 * @return void
	 */
	public native void hangup(int callNo);

	/**
	 * 登出一个FreePP帐号。
	 * 
	 * @param regId
	 *            登入帐号时返回的标识符
	 * 
	 * @return void
	 */
	public native void unregister(int regId);

	public native void SetIaxDebug(int debug_switch); // 0,1 ,default 0

	public native int GetJniVersion();

}